<?php

require_once 'Net/UserAgent/Mobile.php';
require_once 'Net/IPv4.php';
require_once 'HTML/CSS/Mobile.php';

class Mobile_Util
{
    /** @var    object  Ethna_Controller    controllerオブジェクト */
    var $controller;
    
    /** @var    object  Ethna_Controller    controllerオブジェクト($controllerの省略形) */
    var $ctl;
    
    /** @var    object  Ethna_Config        設定オブジェクト */
    var $config;
    
    var $docomo_ip_table;
    var $ezweb_ip_table;
    var $softbank_ip_table;
    var $allowed_host_ip_table;
    
    var $docomo_emoji;
    var $ezweb_emoji;
    var $softbank_emoji;
    var $cocoyaku_emoji;
    
    var $docomo_convert;
    var $ezweb_convert;
    var $softbank_convert;
    
    var $emoji_base_path;
    
    var $css_handler;
    
    function Mobile_Util()
    {
        $this->controller = Ethna_Controller::getInstance();
        $this->ctl = $this->controller;
        $this->config = $this->ctl->getConfig();
        $this->ip_loadTables();
        //$this->emoji_loadMaps();
        $this->emoji_base_path = $this->config->get('emoji_image_path');
        
        $this->css_handler = HTML_CSS_Mobile::getInstance();
        $this->css_handler->setBaseDir($this->config->get('document_root'));
    }
    
    function getMobileAgent()
    {
        return Net_UserAgent_Mobile::singleton();
    }
    
    function isMobile()
    {
        return Net_UserAgent_Mobile::isMobile();
    }
    
    function isDoCoMo()
    {
        return Net_UserAgent_Mobile::isDoCoMo();
    }
    
    function isEZweb()
    {
        return Net_UserAgent_Mobile::isEZweb();
    }
    
    function isSoftBank()
    {
        return Net_UserAgent_Mobile::isSoftBank();
    }
    
    function isWillcom()
    {
    	return Net_UserAgent_Mobile::isWillcom();
    }
    // スマートフォンの定義
    function isSmartPhone($userAgent = null)
    {
    	if (is_null($userAgent)) {
    		$userAgent = @$_SERVER['HTTP_USER_AGENT'];
    	}
    	if(self::isIPhone($userAgent)){
    		return true;
    	}elseif(self::isIPod($userAgent)){
    		return true;
    	}elseif(self::isIPad($userAgent)){
    		return false;       // iPadはPC版の方が見やすい
    	}elseif(self::isAndroid($userAgent)){
    		return true;
    	}elseif(self::isWindowsMobile($userAgent)){
    		return true;
    	}elseif(self::isBlackBerry($userAgent)){
    		return true;
    	}elseif(self::isSymbian($userAgent)){
    		return true;
    	}elseif(self::isPalmWebOS($userAgent)){
    		return true;
    	}
    	return false;
    }
    function isIPhone($userAgent = null)
    {
    	if (is_null($userAgent)) {
    		$userAgent = @$_SERVER['HTTP_USER_AGENT'];
    	}
    	return (bool)preg_match('/iPhone;/',$userAgent);
    }
    function isIPod($userAgent = null)
    {
    	if (is_null($userAgent)) {
    		$userAgent = @$_SERVER['HTTP_USER_AGENT'];
    	}
    	return (bool)preg_match('/iPod;/',$userAgent);
    }
    function isIPad($userAgent = null)
    {
    	if (is_null($userAgent)) {
    		$userAgent = @$_SERVER['HTTP_USER_AGENT'];
    	}
    	return (bool)preg_match('/iPad;/',$userAgent);
    }
    function isAndroid($userAgent = null)
    {
    	if (is_null($userAgent)) {
    		$userAgent = @$_SERVER['HTTP_USER_AGENT'];
    	}
    	return (bool)preg_match('/Android/',$userAgent);
    }
    
    // 以下は対応する必要がある場合に適宜定義してください
    function isWindowsMobile($userAgent = null){return false;}
    function isBlackBerry($userAgent = null){return false;}
    function isSymbian($userAgent = null){return false;}
    function isPalmWebOS($userAgent = null){return false;}
    
    function isMobileMailAddress($str)
    {
        return preg_match('/(?:docomo|ezweb|softbank|pdx|vodafone|disney|emnet|ido).ne.jp$/', $str) != 0;
    }
    
    function getUID()
    {
        $agent = Mobile_Util::getMobileAgent();
        if (method_exists($agent, 'getUID')) {
          return $agent->getUID();
        } else {
          return '';
        }
    }
    
    function getXMLDecl()
    {
        $str = '<?xml version="1.0" encoding="UTF-8"?>';
        
        if (Mobile_Util::isDoCoMo()) {
            
            $str = '<?xml version="1.0" encoding="Shift_JIS"?>';
            
        } else if(Mobile_Util::isEZweb()) {
            
            $str = '<?xml version="1.0" encoding="Shift_JIS"?>';
            
        } else if(Mobile_Util::isSoftBank()) {
            
            $str = '<?xml version="1.0" encoding="UTF-8"?>';
        }
        
        return $str;
    }
    
    function getDoctypeDecl()
    {
        $str = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
        
        if (Mobile_Util::isDoCoMo()) {
            
            $str = '<!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd">';
            
        } else if(Mobile_Util::isEZweb()) {
            
            $str = '<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml-basic.dtd">';
            
        } else if(Mobile_Util::isSoftBank()) {
            
            $str = '<!DOCTYPE html PUBLIC "-//JPHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd">';
        }
        
        return $str;
    }
    
    function getMetaContentType()
    {
        $str = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
        
        if (Mobile_Util::isDoCoMo()) {
            
            $str = '<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" />';
            
        } else if(Mobile_Util::isEZweb()) {
            
            $str = '<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />';
            
        } else if(Mobile_Util::isSoftBank()) {
            
            $str = '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
        }
        
        return $str;
    }
    
    function getMetaCacheConfig()
    {
        $str = '<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="-1" />';
        
        return $str;
    }
    
    function getIStyle($mode, $escape = true)
    {
        $istyle_attr = array();
        
        if (Mobile_Util::isDoCoMo()) {
            
            $istyle_attr['istyle'] = $mode;
            switch ($mode) {
            case 1:
                $istyle_attr['style'] = '-wap-input-format:"*<ja:h>"'; //$escape ? "-wap-input-format:&quot;*&lt;ja:h&gt;&quot;" : "-wap-input-format:'*<ja:h>'";
                break;
            case 2:
                $istyle_attr['style'] = '-wap-input-format:"*<ja:hk>"'; //"-wap-input-format:&quot;*&lt;ja:hk&gt;&quot;";
                break;
            case 3:
                $istyle_attr['style'] = '-wap-input-format:"*<ja:en>"'; //"-wap-input-format:&quot;*&lt;ja:en&gt;&quot;";
                break;
            case 4:
                $istyle_attr['style'] = '-wap-input-format:"*<ja:n>"'; // "-wap-input-format:&quot;*&lt;ja:n&gt;&quot;";
                break;
            }
            
            if ($escape) {
                $istyle_attr['style'] = htmlspecialchars($istyle_attr['style'], ENT_QUOTES);
            }
            
        } else if(Mobile_Util::isEZweb()) {
            
            switch ($mode) {
            case 1:
                $istyle_attr['format'] = "*M";
                break;
            case 2:
                $istyle_attr['format'] = "*M";
                break;
            case 3:
                $istyle_attr['format'] = "*m";
                break;
            case 4:
                $istyle_attr['format'] = "*N";
                break;
            }
            
        } else if(Mobile_Util::isSoftBank()) {
            
            switch ($mode) {
            case 1:
                $istyle_attr['mode'] = "hiragana";
                break;
            case 2:
                $istyle_attr['mode'] = "katakana";
                break;
            case 3:
                $istyle_attr['mode'] = "alphabet";
                break;
            case 4:
                $istyle_attr['mode'] = "numeric";
                break;
            }
        }
        
        return $istyle_attr;
        
    }
    
    function ip_loadTables()
    {
        require_once 'etc/mobile_ip_tables/docomo_ip_table.php';
        $this->docomo_ip_table = $docomo_ip_table;
        
        require_once 'etc/mobile_ip_tables/ezweb_ip_table.php';
        $this->ezweb_ip_table = $ezweb_ip_table;
        
        require_once 'etc/mobile_ip_tables/softbank_ip_table.php';
        $this->softbank_ip_table = $softbank_ip_table;
        
        require_once 'etc/mobile_ip_tables/allowed_host_ip_table.php';
        $this->allowed_host_ip_table = $allowed_host_ip_table;
    }
    
    function ip_isValidMobileCarrierIp()
    {
        $remote_address;
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            $remote_address = $_SERVER['HTTP_CLIENT_IP'];
        } else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $remote_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $remote_address = $_SERVER['REMOTE_ADDR'];
        }
        $result = false;
        
        if (Mobile_Util::isDoCoMo()) {
            
            $result = $this->_ip_inAddress($remote_address, $this->docomo_ip_table);
            
        } else if (Mobile_Util::isEZweb()) {
            
            $result = $this->_ip_inAddress($remote_address, $this->ezweb_ip_table);
            
        } else if (Mobile_Util::isSoftBank()) {
            
            $result = $this->_ip_inAddress($remote_address, $this->softbank_ip_table);
        }
        
        if (!$result) {
            $result = $this->_ip_inAddress($remote_address, $this->allowed_host_ip_table);
        }
        
        return $result;
    }
    
    function _ip_inAddress($check_ip, $ip_table)
    {
        foreach ($ip_table as $ip) {
            $ip = trim($ip);
            if (strcmp($check_ip, $ip) == 0 || Net_IPv4::ipInNetwork($check_ip, $ip)) {
                return true;
            }
        }
        
        return false;
    }
    
    function css_toInline($str)
    {
        try {
            $str = $this->css_handler->apply($str);
        } catch (Exception $e) {
            Ethna::raiseError(sprintf('モバイルCSSファイルのインライン化処理でエラーが発生しました CODE[%d] MESSAGE[%s]', $e->getCode(), $e->getMessage()));
        }
        
        return $str;
    }
    
    function convertIncompatibleChar($str)
    {
        $search = array(
            '窶骭?',  // 半角ダッシュ
            '窶髏?',  // 全角ダッシュ
        );
        
        $replace = array(
            '-',  // 半角ハイフン
            '―', // 全角水平バー
        );
        
        return str_replace($search, $replace, $str);
    }
    
    function getInternalLinkWithSessionID($url)
    {
        // 非モバイルもしくはセッションが存在しない場合はそのまま返す
        if (!Mobile_Util::isMobile() || session_id() == '') {
            return $url;
        }
        
        $url_array = parse_url($url);
        if ($url_array === false) {
            return $url;
        }
        
        $site_url = $this->config->get('url');
        $site_url_array = parse_url($site_url);
        // 内部リンクでない場合はそのまま返す
        if (isset($site_url_array['host']) && isset($url_array['host']) && stripos($site_url_array['host'], $url_array['host']) !== 0) {
		    return $url;
        }
        
        $new_url = '';
        
        if (isset($url_array['scheme'])) {
            $new_url .= $url_array['scheme'] . '://';
        }
        
        if (isset($url_array['host'])) {
            $new_url .= $url_array['host'];
        }
        
        if (isset($url_array['port'])) {
            $new_url .= ':' . $url_array['port'];
        }
        
        if (isset($url_array['path'])) {
            $new_url .= $url_array['path'];
        }
        
        if (isset($url_array['query'])) {
            $new_url .= '?' . $url_array['query'];
            $new_url .= '&' . session_name() . '=' . session_id();
        } else {
            $new_url .= '?' . session_name() . '=' . session_id();
        }
        
        if (isset($url_array['fragment'])) {
            $new_url .= '#' . $url_array['fragment'];
        }
        
        return $new_url;
    }
    
    function emoji_loadMaps()
    {
        require_once 'emoji_maps/docomo_emoji.php';
        $this->docomo_emoji = $docomo_emoji;
        
        require_once 'emoji_maps/ezweb_emoji.php';
        $this->ezweb_emoji = $ezweb_emoji;
        
        require_once 'emoji_maps/softbank_emoji.php';
        $this->softbank_emoji = $softbank_emoji;
        
        require_once 'emoji_maps/docomo_convert.php';
        $this->docomo_convert = $docomo_convert;
        
        require_once 'emoji_maps/ezweb_convert.php';
        $this->ezweb_convert = $ezweb_convert;
        
        require_once 'emoji_maps/softbank_convert.php';
        $this->softbank_convert = $softbank_convert;
        
		require_once 'emoji_maps/cocoyaku_emoji.php';
        $this->cocoyaku_emoji = $cocoyaku_emoji;        
    }
    
    function emoji_count($str)
    {
        //return preg_match_all('/{emoji=([a-z0-9, ]+)}/i', $str, $matches);
        return preg_match_all('/{emoji=([a-z0-9_, ]+)}/i', $str, $matches);
    }
    
    function emoji_replace($str, $replace)
    {
        //return preg_replace('/{emoji=([a-z0-9, ]+)}/i', $replace, $str);
        return preg_replace('/{emoji=([a-z0-9_, ]+)}/i', $replace, $str);
    }
    
    function emoji_strip($str)
    {
        //return preg_replace('/{emoji=([a-z0-9, ]+)}/i', '', $str);
        return preg_replace('/{emoji=([a-z0-9_, ]+)}/i', '', $str);
    }
    
    function emoji_escape($str)
    {
        //return preg_replace('/{emoji=([a-z0-9, ]+)}/i', '[[emoji=$1]]', $str);
        return preg_replace('/{emoji=([a-z0-9_, ]+)}/i', '[[emoji=$1]]', $str);
    }
    
    function emoji_unescape($str)
    {
        //return preg_replace('/\[\[emoji=([a-z0-9, ]+)\]\]/i', '{emoji=$1}', $str);
        return preg_replace('/\[\[emoji=([a-z0-9_, ]+)\]\]/i', '{emoji=$1}', $str);
    }
    
    function emoji_inputFilter($data)
    {
        if (is_array($data)) {
            
            $data = array_map(array($this, 'emoji_inputFilter'), $data);
            
        } else if (!empty($data)) {
            
            $pattern = '';
            $encode = '';
            
            if (Mobile_Util::isDoCoMo()) {
                // docomo絵文字（Shift_JIS）にマッチした正規表現
                $pattern = '/(\xF8[\x9F-\xFC])|(\xF9[\x40-\xFC])/';
                $encode = 'SJIS-win';
                
            } else if (Mobile_Util::isEZweb()) {
                // au絵文字（Shift_JIS）にマッチした正規表現
                $pattern = '/[\xF3\xF4\xF6\xF7][\x40-\xFC]/';
                $encode = 'SJIS-win';
                
            } else if (Mobile_Util::isSoftBank()) {
                // SoftBank絵文字（UTF-8）にマッチした正規表現
                $pattern = '/\xEE([\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF])/';
                $encode = 'UTF-8';
            }
            
            $old_data = $data;
            $new_data = '';
            
            while (true) {
                if (mb_strlen($old_data, $encode) == 0) {
                    break;
                }
                
                $moji = mb_substr($old_data, 0, 1, $encode);
                $old_data = mb_substr($old_data, 1, mb_strlen($old_data, $encode), $encode);
                
                $new_data .= preg_replace_callback($pattern, array($this, '_emoji_inputConvert'), $moji);
                
                //$this->ctl->logger->log(LOG_DEBUG, "$old_data [$moji] $new_data");
            }
            
            $data = $new_data;
        }
        
        return $data;
    }
    
    function _emoji_inputConvert($matches)
    {
        if (empty($matches) || empty($matches[0])) {
            return '';
        }
        
        $emoji = $matches[0];
        
        $emoji_16 = strtoupper(bin2hex($emoji));
        
        $output = '';
        $emoji_code = '';
        $format = '';
        
        if (Mobile_Util::isDoCoMo()) {
            
            $emoji_code = $this->docomo_emoji[$emoji_16];
            $format = '{emoji=%s}';
            
        } else if (Mobile_Util::isEZweb()) {
            
            $emoji_code = $this->ezweb_emoji[$emoji_16];
            $format = '{emoji=,%s}';
            
        } else if (Mobile_Util::isSoftBank()) {
            
            $emoji_code = $this->softbank_emoji[$emoji_16];
            $format = '{emoji=,,%s}';
        }
        
        if (!empty($emoji_code)) {
            $output = sprintf($format, $emoji_code);
        }
        
        return $output;
    }
    
    function emoji_docomo2internal($str)
    {
        return preg_replace('/&#x(E[67][0-9A-Z]{2});/', '{emoji=$1}', $str);
    }
    
    function emoji_outputFilter($str)
    {
        // テンプレートに記述されたdocomo絵文字を内部絵文字コードに変換
        $str = $this->emoji_docomo2internal($str);
        
        // 内部絵文字コードを各キャリアの絵文字に変換
        //$str = preg_replace_callback('/{emoji=([a-z0-9, ]+)}/i', array($this, '_emoji_outputConvert'), $str);
        $str = preg_replace_callback('/{emoji=([a-z0-9_, ]+)}/i', array($this, '_emoji_outputConvert'), $str);
        
        
        // エスケープされた内部絵文字コードを戻す
        $str = $this->emoji_unescape($str);
        
        return $str;
    }
    
    function _emoji_outputConvert($matches)
    {
        if (empty($matches) || !is_array($matches) || count($matches) != 2) {
            return '';
        }
        
        $emoji_code = trim($matches[1]);
        $emoji_code_array = explode(',', $emoji_code);
        $emoji_code_array = array_map('trim', $emoji_code_array);
        //print_r($emoji_code_array);
        
        $output = '';
        
        if (Mobile_Util::isDoCoMo()) {
            // docomo用に絵文字出力
            
            if (empty($output) && !empty($emoji_code_array[0])) {
                // docomoの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[0]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'docomo', 'docomo');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[0]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[1])) {
                // auの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[1]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'ezweb', 'docomo');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[1]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[2])) {
                // SoftBankの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[2]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'softbank', 'docomo');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[2]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[3])) {
                // PCで登録した絵文字用
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[3]);
	            }
            }
                        
            if (empty($output)) {
                $output = '〓';
            }
            
            $output = mb_convert_encoding($output, 'SJIS-win', 'UTF-8');
            
        } else if (Mobile_Util::isEZweb()) {
            // au用に絵文字出力
            
            if (empty($output) && !empty($emoji_code_array[1])) {
                // auの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[1]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'ezweb', 'ezweb');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[1]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[0])) {
                // docomoの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[0]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'docomo', 'ezweb');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[0]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[2])) {
                // SoftBankの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[2]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'softbank', 'ezweb');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[2]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[3])) {
                // PCで登録した絵文字用
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[3]);
	            }
            }
                        
            if (empty($output)) {
                $output = '〓';
            }
            
            $output = mb_convert_encoding($output, 'SJIS-win', 'UTF-8');
            
        } else if (Mobile_Util::isSoftBank()) {
            // SoftBank用に絵文字出力
            
            if (empty($output) && !empty($emoji_code_array[2])) {
                // SoftBankの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[2]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'softbank', 'softbank');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[2]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[0])) {
                // docomoの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[0]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'docomo', 'softbank');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[0]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[1])) {
                // auの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[1]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'ezweb', 'softbank');
                if (is_array($c_emoji_value)) {
                    for ($i = 0; $i < count($c_emoji_value); $i++) {
                        $output .= '&#x' . $c_emoji_value[$i] . ';';
                    }
                } else {
                    $output = $c_emoji_value;
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[1]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[3])) {
                // PCで登録した絵文字用
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[3]);
	            }
            }
                        
            if (empty($output)) {
                $output = '〓';
            }
            
        } else {
            // PC用に絵文字出力（画像を表示）
            
            if (empty($output) && !empty($emoji_code_array[0])) {
                // docomoの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[0]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'docomo', 'docomo');
                if (!empty($c_emoji_value)) {
                    $output = '<img src="' . $this->emoji_base_path . 'docomo/' . $c_emoji_value[0] . '.gif" />';
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[0]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[1])) {
                // auの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[1]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'ezweb', 'ezweb');
                if (!empty($c_emoji_value)) {
                    $output = '<img src="' . $this->emoji_base_path . 'ezweb/' . $c_emoji_value[0] . '.gif" />';
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[1]);
	            }                
            }
            
            if (empty($output) && !empty($emoji_code_array[2])) {
                // SoftBankの絵文字番号が存在する場合
                $emoji_code = strtoupper($emoji_code_array[2]);
                $c_emoji_value = $this->_emoji_convert($emoji_code, 'softbank', 'softbank');
                if (!empty($c_emoji_value)) {
                    $output = '<img src="' . $this->emoji_base_path . 'softbank/' . $c_emoji_value[0] . '.gif" />';
                }
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[2]);
	            }
            }
            
            if (empty($output) && !empty($emoji_code_array[3])) {
                // PCで登録した絵文字用
	            if (empty($output)) {
	                $output = $this->_emoji_get($emoji_code_array[3]);
	            }
            }
                        
            if (empty($output)) {
                $output = '〓';
            }
        }
        
        return $output;
    }
    
    function _emoji_convert($emoji_code, $from, $to)
    {
        $array_name = $from . '_convert';
        $convert_array = $this->$array_name;
        if (!empty($convert_array[$emoji_code][$to])) {
            return $convert_array[$emoji_code][$to];
        }
        
        return null;
    }
    
    
    function _emoji_get($emoji_code)
    {
    	if(in_array($emoji_code, $this->cocoyaku_emoji)){
    		return '<img src="' . $this->emoji_base_path . 'cocoyaku/' . $emoji_code . '.gif" />';
    	}
    	if(in_array($emoji_code, $this->ezweb_emoji)){
    		return '<img src="' . $this->emoji_base_path . 'ezweb/' . $emoji_code . '.gif" />';
    	}    	
        return null;
    }    
    // #99 Start Luvina Modify
    function isIos5OrEarlier() {
        if(self::isIPhone() || self::isIPod() || self::isIPad()) {
            $userAgent = @$_SERVER['HTTP_USER_AGENT'];
            if(strpos($userAgent, 'OS 1') || strpos($userAgent, 'OS 2') || strpos($userAgent, 'OS 3') || strpos($userAgent, 'OS 4') || strpos($userAgent, 'OS 5')) {
                return true;
            }
        }
        return false;
    }
    // #99 End Luvina Modify
}
